// 创建用户相关的小仓库
import { defineStore } from 'pinia'
import { reqLogin, reqUserInfo, reqLogout } from '@/api/user'
import type {
  loginFormData,
  loginResponseData,
  userInfoResponseData,
} from '@/api/user/type'
import { ref } from 'vue'
// 引入数据类型
// 引入路由(常量路由)
import { constantRouter } from '@/router/routes'
/* 用于在Vue Router中定义静态路由的类型
它包含了描述路由路径、组件、名字等信息的对象
让代码更加类型安全和可维护 */
import type { RouteRecordRaw } from 'vue-router'

// 创建用户小仓库
const useUserStore = defineStore(
  'User',
  () => {
    // token数据
    const token =
      ref(JSON.parse(localStorage.getItem('User') || '').token) || ref()
    // 路由数据
    const menuRoutes = ref<RouteRecordRaw[]>(constantRouter)
    // 用户名
    const username = ref('')
    // 头像
    const avatar = ref('')

    // 用户登录的方法
    const userLogin = async (data: loginFormData) => {
      const res: loginResponseData = await reqLogin(data)
      // 登录成功200 -> 存储token
      // 登录失败201 -> 弹出登录失败错误信息
      if (res.code === 200) {
        // pinia仓库存储token并持久化
        token.value = res.data as string
        // 使async函数返回一个成功的promise
        return true
      } else {
        // 使async函数返回一个失败的promise
        return Promise.reject(new Error(res.data))
      }
    }

    // 获取用户信息的方法
    const userInfo = async () => {
      // 获取用户信息进行数据仓库存储
      const res: userInfoResponseData = await reqUserInfo()
      if (res.code === 200) {
        username.value = res.data.name
        avatar.value = res.data.avatar
        return true
      } else {
        return Promise.reject(res.message)
      }
    }

    // 退出登录的方法
    const userLogout = async () => {
      const res: any = await reqLogout()
      if (res.code === 200) {
        token.value = ''
        username.value = ''
        avatar.value = ''
        return true
      } else {
        return Promise.reject(new Error(res.message))
      }
    }

    return {
      token,
      username,
      avatar,
      menuRoutes,
      userLogin,
      userInfo,
      userLogout,
    }
  },
  {
    // 开启数据持久化
    persist: {
      paths: ['token'],
    },
  },
)

export default useUserStore
